沒有比較就沒有傷害 (?!),在 Java 中處理空值 ( Null ) 一直以來是讓人覺得頭疼與懷疑人生。
讓 Kotlin 特別針對 Null 的處理特別關愛(?),首先讓我們先看看 Java 中 Null 是怎麼擾人的。
//Java Code
int strLength(String strInput) {
return strInput.length();
}
public void main() {
String strInput = "IronMan";
/*
*
* 這裡有 1000 行 code
*
*/
strInput = null;
/*
*
* 這裡有 1000 行 code
*
*/
int length = strLength(strInput);
}
這個範例中,IDE 會報錯並回一個 Runtime Exception ,或許我們現在看得很清楚哪裡出了錯,但在實務上必須從 2000~3000 行裡找出 strInput = null 這一行卻是有著相當的難度。
但 Java 也不是這樣放任 Null 在搗亂,也是有相對應的 annotation 來提醒開發者。
//Java Code
int strLength(@NotNull String strInput) {
return strInput.length();
}
public void main() {
String strInput = "IronMan";
/*
*
* 這裡有 1000 行 code
*
*/
strInput = null;
/*
*
* 這裡有 1000 行 code
*
*/
//在這一步,IDE會"提醒"開發者: strInput 現在為 Null喔
int length = strLength(strInput);
}
然而這 annotation 也只是盡了 提醒 的責任,若沒注意到而編譯下去,仍然可以編譯、仍然可以爆炸(?
而 Kotlin 針對這一現況做了一些改變。
Kotlin 對 null 的預設:
Java 對 type 預設是可以接受為 null 的,但 kotlin 卻是預設皆不可為 null ,所以以上面的例子用 kotlin 來寫的話,就會變成這樣。
//Kotlin Code
fun strLength(strInput: String): Int {
return strInput.length()
}
fun main() {
var strInput = "IronMan"
/*
*
* 這裡有 1000 行 code
*
*/
//在這一步, IDE 就會提醒 Error 並且無法編譯
strInput = null
/*
*
* 這裡有 1000 行 code
*
*/
val length = strLength("strInput")
}
剛剛有說 kotlin 預設是不為 null 的,所以在 strInput = null 時, IDE 就會提醒 Error 並且無法編譯。
剩下還有一部分是關於 object 的 null 處理,我們等明天再來討論!